/*
    建造者模式

    又叫生成器模式

    使用多个简单对象一步步组成复杂对象

    如果需要创建复杂对象，那么就可以考虑使用建造者模式

    建造者模式的四个角色：

1) Product（产品角色）： 一个具体的产品对象。

2) Builder（抽象建造者）： 建造者抽象类。

3) ConcreteBuilder（具体建造者）： 具体的建造者类。

4) Director（指挥者）： 构建的指挥者。

*/

// 具体产品
class Car {
  engine: string; // 引擎
  chassis: string; // 底盘
  body: string; // 车身
}

// 抽象建造者
abstract class Builder {
  body: string;

  addBody(body: string) {
    this.body = body;
    return this;
  }
}

// 具体建造者
class CarBuilder extends Builder {
  engine: string;
  chassis: string;

  addEngine(engine: string) {
    this.engine = engine;
    return this;
  }

  addChassis(chassis: string) {
    this.chassis = chassis;
    return this;
  }

  getProduct() {
    return new Car();
  }
}

// 指挥者
class Auto {
  carBuilder = null;

  constructor(carBuilder) {
    this.carBuilder = carBuilder;
  }

  public build() {
    this.carBuilder.addEngine("垃圾引擎");
    this.carBuilder.addChassis("垃圾底盘");
    this.carBuilder.addBody("垃圾车身");
    return this.carBuilder.getProduct();
  }
}
class BMW {
  carBuilder = null;

  constructor(carBuilder) {
    this.carBuilder = carBuilder;
  }

  build() {
    this.carBuilder.addEngine("高端引擎");
    this.carBuilder.addChassis("高端底盘");
    this.carBuilder.addBody("高端车身");
    return this.carBuilder.getProduct();
  }
}

let car = new Auto(new CarBuilder());
car.build();

let car2 = new BMW(new CarBuilder());
car2.build();
console.log(car);
console.log(car2);
